package main

import (
	"fmt"
	"net"
	"net/url"
)

func main() {
	s := "postgres://user:pass@host.com:5432/path?k=v#f"

	//验证url合法性
	u, err := url.Parse(s)
	if err != nil {
		panic(err)
	}

	//打印url协议
	fmt.Println(u.Scheme)
	// User 包含了所有的认证信息， 这里调用 Username 和 Password 来获取单独的值。
	//在 URL 中，userinfo 部分通常出现在主机部分之前，并且用 @ 符号与主机部分分隔开来。
	fmt.Println(u.User)
	fmt.Println("userName is", u.User.Username())
	p, _ := u.User.Password()
	fmt.Println("password is ", p)

	fmt.Println(u.Host)
	host, port, _ := net.SplitHostPort(u.Host)
	fmt.Println("host is ", host)
	fmt.Println("port is ", port)

	fmt.Println(u.Path)
	//#后面的部分
	fmt.Println(u.Fragment)

	/**
		要得到字符串中的 k=v 这种格式的查询参数，可以使用 RawQuery 函数。
		你也可以将查询参数解析为一个 map。已解析的查询参数 map 以查询字符串为键，
		已解析的查询参数会从字符串映射到到字符串的切片，
		因此如果您只想要第一个值，则索引为 [0]。
	**/
	fmt.Println("RawQuery", u.RawQuery)
	m, _ := url.ParseQuery(u.RawQuery)
	fmt.Println(m)
	fmt.Println(m["k"][0])
}
